SQL - Dicas de TSQL para os bancos de dados do Microsoft SQL Server

Bancos de dados

Este objeto necessita de um carinho especial porque eles suportam os dados de um processo inteiro como vendas, faturamento, compras, acompanhamento de clientes, etc. Note que podemos juntar tudo num banco de dados se o negócio a ser suportado é pequeno mas se for uma grande empresa você talvez precise até de múltiplos servidores.

Já trabalhei gerenciando 25 servidores MS SQL Server e basicamente 2 pessoas conseguiam fazer o serviço. O restante do pessoal utilizava os servidores mas não mantinham eles.

Abaixo cito as principais queries que são utilizadas em bancos de dados. Tentei colocar só sobre banco de dados mas se eu quiser saber as tabelas do banco de dados temos 2 objetos de interesse unidos.

Os principais comandos sobre bancos de dados são :

Comando Efeito
use NomeBanco Seleciona o banco de dados ( NomeBanco ) a ser trabalhado pelas queries.
SysObjects
select * from sysobjects where xtype='U' ou exec sp_tables Lista todas as tabelas de Usuário do Banco de dados atual.
select * from sysobjects where xtype='S' Lista todos os objetos de sistema dentro das tabelas do banco de dados atual.
select * from sysobjects where xtype='P' Lista todas as Stored Procedures do banco de dados atual
select * from sysobjects where xtype='X' Exibe todos os índices de todas as tabelas do banco de dados atual
select * from sysobjects where xtype='F' Exibe todas as Chaves estrangeira ( FK ) do banco de dados atual
select * from sysobjects where xtype='PK' Lista todas as Chaves Primárias ( PK ) do banco de dados atual
select * from sysobjects where xtype='UQ' Lista todas as Chaves Unicas do sistema ( Unique Key Constraint )
select * from sysobjects where xtype='TF' Lista as Funções cadastradas no sistema. Funções nada mais são que uma sequencia de comandos SQL que retornam qualquer tipo de dados, pode ser um número, texto, tabela, etc.
select * from sysobjects where xtype='IF' Lista as Funções cadastradas no sistema.
select * from sysobjects where xtype='V' Lista as views do sistema. Uma view é uma 'visão' particular de um conjunto de dados. Por exemplo, eu posso numa view agrupar inúmeras tabelas e selecionar colunas específicas de cada uma dessas tabelas e com isto dar uma 'visão' específica da informação requerida. Por exemplo, suponha que você queira exibir as vendas por trimestre de um produto e os dados de vendas estão nas tabelas vendas, clientes, vendasProd,vendasFat. Podemos passar parâmetros para a view e ela executará a pesquisa complexa de uma maneira bem facilitada evitando erros.
select * from sysobjects where left(name,3)='TBL' Lista os Objetos do sistema que tenham as primeiras letras como 'TBL'. No exemplo eu assumi que TBL são prefixos de tabelas mas poderia ser qualquer outra notação dos objetos cadastrados no servidor.
select name from sys.triggers where parent_class=1 Lista as triggers cadastradas no sistema - MS SQL SRV 2005
select name from sys.triggers where type='TA' Lista as triggers cadastradas no sistema que são disparadas depois('After')- MS SQL SRV 2005
select name from sys.triggers where type='TR' Lista as triggers cadastradas no sistema que são disparadas antes- MS SQL SRV 2005
select * from sys.sql_dependencies Exibe a lista as dependencias de um objeto em relação a outro.
Contém informações de dependência entre objetos (exibições, procedimentos e gatilhos) no banco de dados e os objetos (tabelas, exibições e procedimentos) contidos em suas definições. MS SQL SRV 2005.
select * from systypes Lista todos os tipos de dados do servidor. MS SQL 2000
select * from sys.systypes Lista todos os tipos de dados do servidor. MS SQL 2005
select name from sysobjects where type='TR' Lista as triggers cadastradas no sistema - MS SQL SRV 2000
select name from sys.triggers where parent_class=1 Lista as triggers cadastradas no sistema - MS SQL SRV 2005
select name from sys.triggers where type='TA' Lista as triggers cadastradas no sistema que são disparadas depois('After')- MS SQL SRV 2005
select name from sys.triggers where type='TR' Lista as triggers cadastradas no sistema que são disparadas antes- MS SQL SRV 2005
select * from sysdepends Exibe a lista as dependencias de um objeto em relação a outro.
Contém informações de dependência entre objetos (exibições, procedimentos e gatilhos) no banco de dados e os objetos (tabelas, exibições e procedimentos) contidos em suas definições. MS SQL SRV 2000.
select * from sys.sql_dependencies Exibe a lista as dependencias de um objeto em relação a outro.
Contém informações de dependência entre objetos (exibições, procedimentos e gatilhos) no banco de dados e os objetos (tabelas, exibições e procedimentos) contidos em suas definições. MS SQL SRV 2005.
select * from systypes Lista todos os tipos de dados do servidor. MS SQL 2000
select * from sys.systypes Lista todos os tipos de dados do servidor. MS SQL 2005
SELECT name, physical_name
FROM sys.master_files
where database_id = db_id('master')
Lista os arquivos que compõe o banco de dados selecionado, tipicamente os arquivos .mdf e .ldf incluindo seus nomes e pastas.
select * from master..sysmessages Exibe todas as mensagens de erro emitidas pelo servidor- MS SQL 2000
select * from sys.messages Exibe todas as mensagens de erro emitidas pelo servidor- MS SQL 2005
select * from master..syslogins where isntgroup=0 and isntname=0 Lista os logins efetuados até o momento no servidor - MS SQL SRV 2000
select * from sys.sql_logins Lista os logins efetuados até o momento no servidor - MS SQL SRV 2005
Outras views dos objetos do sistema MS SQL SRV
select * from sysusers Lista os usuários cadastrados no sistema
select * from syssegments Segmentos - Não funciona no MS SQL SRV 2019
select * from sysconstraints Exibe as constraints cadastradas no sistema. As constraints são Primary Key (PK), Foreign Key (FK), Unique, Not Null, Check, Default. As constraints determinam condições para que o dado 'seja aceitável' ou se 'torne aceitável' numa coluna de uma tabela.
select * from sysfilegroups Exibe o agrupamento dos arquivos de um banco de dados. Inicialmente só existe o Primário(Primary)
SELECT * FROM master.dbo.sysdatabases Lista os bancos de dados do sitema. Normalmente são master, tempdb, model, msdb.
Diversas - Sobre bancos de dados e seus componentes
sp_helpuser Exibe as informações sobre o usuário cadastradas no servidor SQL
DECLARE @db_id smallint;
set @db_id = DB_ID(N'master');
print @db_id
Retorna o ID do banco de dados ( db_ID ). Muito útil para cruzar as informações com os objetos do sistema
RAISERROR('Erro na SP10.', 16, 1) Determinando a saida de uma Procedure com erro.
dbcc checkdb (nome_banco_dados) Função de teste de bancos
dbcc_chectable(nome_tabela) Função de teste de bancos de tabelas

Comando Efeito
use NomeBanco Seleciona o banco de dados ( NomeBanco ) a ser trabalhado pelas queries.
exec xp_msver No parâmetro 'File Version' temos a versão do MS SQL Server instalado. Em 'Plaform' e 'File Description' temos se ele é 32 ou 64 bits.
exec sp_helpdevice Lista os dispositivos do sistema, se existirem.
sp_helpindex sysobjects Lista os índices do servidor.
sp_lock Lista os Locks ativos no momento no SQL.
select 'servidor=' + @@servername + ', Versao=' + @@version Exibe o nome do servidor na Rede e a versão do servidor ms sql.
dbcc showcontig Exibe a fragmentação das tabelas no bd
exec sp_dboption Opções do Servidor - Não funciona no MS SQL 2019
exec sp_configure Exibe a configuração do Servidor SQL
dbcc memusage Exibe a utilização de memória - Não funciona no MS SQL 2019.
sp_who Lista quem esta usando / logado no servidor SQL
select * from sysobjects where xtype='U' ou exec sp_tables Lista todas as tabelas de Usuário do Banco de dados atual.
select * from sysobjects where xtype='S' Lista todos os objetos dentro das tabelas de sistemas do MS SQL SRV.
select * from sysobjects where xtype='P' Lista todas as Stored Procedures do banco de dados atual
select * from sysobjects where xtype='X' Exibe todos os índices de todas as tabelas do banco de dados atual
select * from sysobjects where xtype='F' Exibe todas as Chaves estrangeira ( FK ) do banco de dados atual
select * from sysobjects where xtype='PK' Lista todas as Chaves Primárias ( PK ) do banco de dados atual
select * from sysobjects where xtype='UQ' Lista todas as Chaves Unicas do sistema ( Unique Key Constraint )
select * from sysobjects where xtype='TF' Lista as Funções cadastradas no sistema. Funções nada mais são que uma sequencia de comandos SQL que retornam qualquer tipo de dados, pode ser um número, texto, tabela, etc.
select * from sysobjects where xtype='IF' Lista as Funções cadastradas no sistema.
select * from sysobjects where xtype='V' Lista as views do sistema. Uma view é uma 'visão' particular de um conjunto de dados. Por exemplo, eu posso numa view agrupar inúmeras tabelas e selecionar colunas específicas de cada uma dessas tabelas e com isto dar uma 'visão' específica da informação requerida. Por exemplo, suponha que você queira exibir as vendas por trimestre de um produto e os dados de vendas estão nas tabelas vendas, clientes, vendasProd,vendasFat. Podemos passar parâmetros para a view e ela executará a pesquisa complexa de uma maneira bem facilitada evitando erros.
select * from sysusers Lista os usuários cadastrados no sistema
sp_helpuser Exibe as informações sobre o usuário cadastradas no servidor SQL
select * from sysobjects where left(name,3)='TBL' Lista os Objetos do sistema que tenham as primeiras letras como 'TBL'. No exemplo eu assumi que TBL são prefixos de tabelas mas poderia ser qualquer outra notação dos objetos cadastrados no servidor.
select * from syssegments Segmentos - Não funciona no MS SQL SRV 2019
select * from sysconstraints Exibe as constraints cadastradas no sistema. As constraints são Primary Key (PK), Foreign Key (FK), Unique, Not Null, Check, Default. As constraints determinam condições para que o dado 'seja aceitável' ou se 'torne aceitável' numa coluna de uma tabela.
select * from sysfilegroups Exibe o agrupamento dos arquivos de um banco de dados. Inicialmente só existe o Primário(Primary)
SELECT * FROM master.dbo.sysdatabases Lista os bancos de dados do sitema. Normalmente são master, tempdb, model, msdb.
select * from sysdepends Exibe a lista as dependencias de um objeto em relação a outro.
Contém informações de dependência entre objetos (exibições, procedimentos e gatilhos) no banco de dados e os objetos (tabelas, exibições e procedimentos) contidos em suas definições. MS SQL SRV 2000.
DECLARE @db_id smallint;
set @db_id = DB_ID(N'master');
print @db_id
Retorna o ID do banco de dados ( db_ID ). Muito útil para cruzar as informações com os objetos do sistema
RAISERROR('Erro na SP10.', 16, 1) Determinando a saida de uma Procedure com erro.
SELECT name, physical_name
FROM sys.master_files
where database_id = db_id('master')
Lista os arquivos que compõe o banco de dados selecionado, tipicamente os arquivos .mdf e .ldf incluindo seus nomes e pastas.
select * from master..sysmessages Exibe todas as mensagens de erro emitidas pelo servidor- MS SQL 2000
select * from sys.messages Exibe todas as mensagens de erro emitidas pelo servidor- MS SQL 2005
select * from master..syslogins where isntgroup=0 and isntname=0 Lista os logins efetuados até o momento no servidor - MS SQL SRV 2000
select * from sys.sql_logins Lista os logins efetuados até o momento no servidor - MS SQL SRV 2005
dbcc checkdb (nome_banco_dados) Função de teste de bancos
dbcc_chectable(nome_tabela) Função de teste de bancos de tabelas

Notas :

1-Coloquei com fundo azul os recursos que todo administrador de banco de dados tem que manter em sua mente para realizar as tarefas do seu dia-a-dia na atividade.

2-A função DBCC pode tanto verificar como corrigir pequenos erros em tabelas e bancos de dados. Cabe ao administrador se só vai verificar a integridade ou corrigir esses pequenos erros. Esta mudança é feita setando apenas um parâmetro do comando, se deve ou não corrigir. Recomendo ativar a correção mas lembre-se que isto levará mais tempo para ser realizado e deixará a base de dados inativa para ser corrigida.

--2-Lendo um arquivo texto - Inicio - Declaração de variáveis

alter PROCEDURE LE_ARQUIVO_TEXTO (
@FileName varchar(255),
@Text1 varchar(2000) OUT) AS

DECLARE @FS int
DECLARE @OLEResult int
DECLARE @FileID int

--2.1- criando o manipulador (file script object) do arquivo no servidor - Acesso a arquivos

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
IF @OLEResult <> 0 begin
   PRINT 'ERRO na criação do Scripting.FileSystemObject'
   return
end

--2.2-Abrindo o arquivo

execute @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @FileName, 1
IF @OLEResult <> 0 begin
   PRINT 'Erro no OpenTextFile'
   return
end

--2.3-Lendo o texto

execute @OLEResult = sp_OAMethod @FileID, 'ReadLine', @Text1 OUT
IF @OLEResult <> 0 begin
   PRINT 'Erro no Readline'
   return
end

--2.4-Eliminando o arquivo o texto

EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS

--2.5-Chamando a função que lê o arquivo texto

declare @dado_lido varchar(8000)
exec Le_ARQUIVO_TEXTO 'C:\nomearq.TXT',@dado_lido out
print 'Dado lido:' + @dado_lido

--pre-requisito : precisa que o oledb esteja habilitado

exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ole Automation Procedures',1
reconfigure
exec sp_configure 'show advanced options',0
reconfigure

3-Carregando um arquivo texto para uma tabela

A primeira coisa a ser definida é a estrutura fisica dos campos no arquivo texto. Na querie iremos separar esses campos pelo comando substring.

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

alter procedure loaddata as
BEGIN
declare @query varchar(7000)
declare @string varchar(1500)
declare @string1 varchar(500)
drop table x
create table x (name varchar(2000))
set @query ='master.dbo.xp_cmdshell "type C:\SAMPLE_FILE.TXT"'
insert x exec (@query)
declare C1 cursor local fast_forward for select name from x;
open c1
fetch next from c1 into @string
while @@FETCH_STATUS = 0
BEGIN
   fetch next from c1 into @string1
      if (len(@string1)<>0 or @string1<>null)
      Begin
         set @string=@string+@string1
      END

      ELSE if @string<>''
      Begin
         insert into filedata values(
            substring(@string,1,16),
            substring(@string,17,35),
            substring(@string,52,25),
            substring(@string,77,25),
            substring(@string,102,25),
            substring(@string,127,25),
            substring(@string,152,25),
            substring(@string,177,20),
            substring(@string,197,15),
            substring(@string,212,15),
            substring(@string,227,50),
            substring(@string,277,15),
            substring(@string,292,17),
            substring(@string,309,17),
            substring(@string,326,17),
            substring(@string,343,17),
            substring(@string,360,17),
            substring(@string,377,17),
            substring(@string,394,3),
            substring(@string,397,6),
            substring(@string,403,4),
            substring(@string,407,6),
            substring(@string,413,40),
            substring(@string,453,15),
            substring(@string,468,1),
            substring(@string,469,30),
            substring(@string,499,30),
            substring(@string,529,30),
            substring(@string,559,30),
            substring(@string,588,30),
            substring(@string,619,30),
            substring(@string,649,30),
            substring(@string,679,30),
            substring(@string,709,30),
            substring(@string,739,30)
         )
         set @string=''
   End -- if @string<>''
END -- while @@FETCH_STATUS

END --@@FETCH_STATUS = 0

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON

GO

4-Gravando dados em um arquivo texto

CREATE PROCEDURE GRAVA_ARQUIVO_TEXTO (
@FileName varchar(255),
@Text1 varchar(2000)) AS

DECLARE @FS int
DECLARE @OLEResult int
DECLARE @FileID int
  

-- criando o file script object no servidor
EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
IF @OLEResult <> 0 PRINT 'ERRO na criação do Scripting.FileSystemObject'

<> --Abrindo o arquivo
execute @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @FileName, 8, 1
IF @OLEResult <> 0 PRINT 'Erro no OpenTextFile'

--Gravando o texto
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, @Text1
IF @OLEResult <> 0 PRINT 'Erro no WriteLine' EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS

exec GRAVA_ARQUIVO_TEXTO 'C:\BKP_LOCAL_SRVX\teste_gravacao.txt','alo, alo...123...isto e um teste'

--pre-requisito : precisa que o oledb esteja habilitado
exec sp_configure 'show advanced options',1
reconfigure
sp_configure
exec sp_configure 'Ole Automation Procedures',1
reconfigure
exec sp_configure 'show advanced options',0
reconfigure

GRAVA_ARQUIVO_TEXTO 'C:\BKP_LOCAL_SRVX\dbcc.bat','TESTE'

I) Serviços que compõe o SQL Server :

1) Serviço MS SQL Server : É o servidor de banco de dados em sí.

2) Serviço MS SQL Agent : Gerencia Jobs, Alertas e Operators

3) Serviço Ms Distributed Transaction Cordinator (DTS) : Permite que clientes heterogêneos acessem as transações do servidor.


II) Ferramentas de Administração do servidor :

1- SQL Server Enterprise Manager Snap-in MS Management Console (MMC) : Cliente administrativo do servidor. Permite administrar o servidor.

2- SQL Server Client Configuration : Configura os componentes de comunicação entre o cliente e o server como protocolos de rede ativos ou não.

3- SQL Server Performance Monitor : Permite monitorar em real-time as estatísticas de performance do servidor permitindo uma análise administrativa de seu desempenho.

4- SQL Server Profiler : Permite salvar continuamente as atividades do servidor bem como auditoria.

5- SQL Server Query Analyser : Ferramenta gráfica que permite interagir com a base de dados. Permite visualizar o plano de execução da query, as informações de estatísticas e performance do servidor.

6 - SQL Server Service Management : Permite verificar e alterar o estado dos serviços do ms sql ( Iniciar, Parar, pausar)

7 - SQL Server Setup : Permite instalar ou reconfigurar o servidor sql

8- SQL Server Wizards : É uma coleção de ferramentas que guiam os usuários na execução de tarefas complexas.


SQL Agent : Executa as seguintes tarefas administrativas :


1 - Gerenciamento de alertas - alert management : Resultado de processos quando um job é completado ( via event log do nt )

2 - Notificações - notifications : Emissão de Email ligado aos alertas

3- Execução de Jobs - job execution : Executa os jobs agendados

4 - Gerenciamento de replicação - Replication Management :Sincroniza os dados entre os servidores.


Versão do Framework .NET utilizadas nos servidores MS SQL Server :


Versão MS SQL - Versão Framework

2003 - 1.0

2005 - 2.0

2008 - 3.5

2010 - 4.0


Podem dar erros por falta de permissão administrativa :

exec xp_cmdshell "dir"
exec xp_loginconfig
sp_help sysdatabases
exec xp_msver

Obtenção das colunas com tipo e demais informações :

SELECT sysobjects.name AS table_name, syscolumns.name AS column_name,
systypes.name AS datatype, syscolumns.length AS length
FROM sysobjects INNER JOIN
syscolumns ON sysobjects.id = syscolumns.id
INNER JOIN systypes ON syscolumns.xtype = systypes.xtype
WHERE (sysobjects.xtype = 'U')
ORDER BY sysobjects.name, syscolumns.colid

SELECT sysobjects.name AS table_name, syscolumns.name AS column_name,
systypes.name AS datatype, syscolumns.LENGTH AS LENGTH
FROM sysobjects INNER JOIN syscolumns ON sysobjects.id = syscolumns.id
INNER JOIN systypes ON syscolumns.xtype = systypes.xtype
WHERE (sysobjects.xtype = 'U')ORDER BY sysobjects.name,
syscolumns.colid


Agendamento de tarefas nos servidores :

Muitas tarefas de manutenção são feitas em horários de baixa ou nenhuma utilização do servidor. O objetivo é aproveitar esse tempo ocioso para garantir o perfeito funcionamento do servidor amanhã e sempre.

O mais importante é listar as atividades de manutenção a serem executadas e definir o horário que serão executadas levando em conta o tempo que elas demoram para ser executadas. Jamais devemos executar duas tarefas de manutenção ao mesmo tempo especialmente se elas forem competitivas com o mesmo tipo de recurso do servidor.

Abaixo cito um modelo de tarefas e do escalonamento para execução das mesmas

20 hs -> Check da integridade dos bancos de dados ( DBCC CHECKDB )

21 hs -> Compactação dos bancos de dados ( DBCC SHRINKDB )

23:30 hs -> Backup Full das bases agendadas

07:40 hs -> SPs de Atualização dados diários